var express = require('express');
var router = express.Router();

const sql = require("../sql/sql");
const user = require("../sql/user");
const tools = require("../tools/index");
const uuid = require("node-uuid");
const md5 = require("md5");
const jwt = require("jsonwebtoken");

function random(){
    return Math.round(Math.random() * (9999-1000)) + 1000;
}


router.get('/',function(req,res,next){
    res.send("这是一个user信息接口");
})

router.post("/changepsd",function(req,res,next){
    console.log(req.body)
    const { userName,tel,code,password } =req.body;
    sql.find(user,{userName,tel}).then(data=>{
        if(data.length > 0){
            if(data[0].code == code){
                sql.update(user,{userName,tel},{
                    password:md5(password),
                }).then(()=>{
                    res.send({
                        state:200,
                        title:"找回密码成功"
                    })
                })
            }else{
                res.send({
                    state:202,
                    title:"验证码不正确"
                })
            }
        }else{
            res.send({
                state:201,
                title:"用户名或手机号不正确"
            })
        }
    })
})

router.get('/findsendMsg', function(req, res, next) {
    let rn = random();
    let tel = req.query.tel;
    let userName = req.query.userName;
    // 根据手机号查询用户集合
    sql.find(user, {tel,userName}, {}).then(data=>{
        // 如果查询到手机号记录
        if(data.length > 0){
            tools.sendMsg(tel,rn).then(()=>{
                sql.update(user,{tel},{
                    code:rn
                })
                res.send({
                    state:200,
                    title:"验证码发送成功",
                    code:rn     
                })
            })
        }else{
            res.send({
                state:201,
                title:"该用户名或手机号未注册"
            })
        }
    })
});


/**
* @apiGroup 用户模块
* @api {get} /api/user/sendMsgR 注册验证码
* @apiVersion 0.0.0
* @apiDescription 发送注册短信验证码
* @apiParam {String} tel 接收验证码的手机号
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
 res.send({
    "state":200,
    "title":"请求成功",
    "code":"1234"
 })
 res.send({
    "state":20,
    "title":"手机号已被注册"
 })
* @apiSampleRequest http://localhost:3000/api/user/sendMsgR
*/

//注册验证码
router.get('/sendMsgR', function(req, res, next) {
    let rn = random();
    let tel = req.query.tel;
    // 根据手机号查询用户集合
    sql.find(user, {tel}, {}).then(data=>{
        // 如果查询到手机号记录
        if(data.length > 0){
            // 验证账户名和密码是否为空
            if(data[0].userId){
                // 如果不为空，表示该手机号已经被注册
                res.send({
                    state:201,
                    title:"该手机号已被注册"
                })
            }else{
                // 如果为空，表示只是发送过短信验证码，重新发送一条验证码，并更新该手机号对应的验证码即可
                tools.sendMsg(tel,rn).then(()=>{
                    sql.update(user,{tel},{
                        code:rn
                    })
                    res.send({
                        state:200,
                        title:"已经发送过验证码，重新发送",
                        code:rn     // 测试，将来要删的
                    })
                })
            }
        }else{
            // 没有查询到记录
            // 表示手机号没有被注册
            // 根据手机号发送验证码，并在发送成功后将手机号和验证码一起插入用户集合
            tools.sendMsg(tel,rn).then(()=>{
                sql.insert(user,{
                    tel,
                    code:rn
                })
                res.send({
                    state:200,
                    title:"短信验证码发送成功",
                    code:rn     // 测试，将来要删的
                })
            })
        }
    })
});

/**
* @apiGroup 用户模块
* @api {get} /api/user/sendMsg 登录验证码
* @apiVersion 0.0.0
* @apiDescription 发送登录短信验证码
* @apiParam {String} tel 接收验证码的手机号
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {object} data 请求数据
* @apiSuccessExample {json} Success-Response:
* {
*    "state":200,
*    "title":"请求成功",
*    "code":"123456"
* }
* @apiSampleRequest http://localhost:3000/api/user/sendMsg
*/

//登录验证码
router.get('/sendMsg', function(req, res, next) {

    let rn = random();
    let tel = req.query.tel;
    // 根据手机号查询用户集合
    sql.find(user, {tel}, {}).then(data=>{
        // 如果查询到手机号记录,
        if(data.length > 0){
                tools.sendMsg(tel,rn).then(()=>{
                    sql.update(user,{tel},{
                        code:rn
                    })
                    res.send({
                        state:200,
                        title:"已经发送过验证码，重新发送",
                        code:rn     // 测试，将来要删的
                    })
                })
        }else{
            // 没有查询到记录
            // 表示手机号没有被注册
            // 根据手机号发送验证码，并在发送成功后将手机号和验证码一起插入用户集合
            tools.sendMsg(tel,rn).then(()=>{
                sql.insert(user,{
                    tel,
                    code:rn
                })
                res.send({
                    state:200,
                    title:"短信验证码发送成功",
                    code:rn     
                })
            })
        }
    })
});


/**
* @apiGroup 用户模块
* @api {post} /user/register 用户注册
* @apiVersion 0.0.0
* @apiDescription 用户注册
* @apiParam {string} tel 手机号
* @apiParam {string} userName 用户名
* @apiParam {string} passWord 密码
* @apiParam {string} code 验证码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {json} data 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    stete:201,
    title:"用户名已被注册",
})
 res.send({
    state:202,
    title:"请先发送验证码"
})
res.send({
    state:203,
    title:"一个手机号只能注册一个账号"
})
res.send({
    stete:200,
    title:"注册成功"
})
res.send({
    state:204,
    title:"验证码不正确"
})
* @apiSampleRequest http://localhost:3000/api/user/register
*/

router.post("/register",function(req,res,next){
    console.log(req.body)
    const { userName,tel,code } =req.body;
    const password = req.body.passWord;
    sql.find(user,{userName}).then(data=>{
        if(data.length > 0){
            res.send({
                stete:201,
                title:"用户名已注册"
            })
        }else{
            sql.find(user,{tel}).then(data2=>{
                if(data2.length <=0){
                    res.send({
                        state:202,
                        title:"请先发送验证码"
                    })
                }else if(data2[0].userName){
                    res.send({
                        state:203,
                        title:"一个手机号只能注册一个账号"
                    })
                }else if(data2[0].code == code){
                    sql.update(user,{tel},{
                        userId:"user" + uuid.v1(),
                        userName,
                        nickName:"临时用户",
                        password:md5(password),
                        email:"",
                        birthday:Date.now(),
                        sex:1,
                        hobby:[],
                        lastLogin:0,
                        joinDate:Date.now(),
                        headPhoto:'',
                        loginState:0
                    })
                    res.send({
                        state:200,
                        title:"注册成功"
                    })
                }else{
                    res.send({
                        state:204,
                        title:"验证码不正确"
                    })
                }
            })
        }
    })
})






/**
* @apiGroup 用户模块
* @api {get} /user/smslogin 验证码登录
* @apiVersion 0.0.0
* @apiDescription 验证码登录
* @apiParam {string} tel 手机号
* @apiParam {string} code 验证码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {json} data 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    stete:201,
    title:"手机号不正确",
})
res.send({
    state:202,
    title:"验证码不正确"
})
res.send({
    state:200,
    title:"登录成功"
})
* @apiSampleRequest http://localhost:3000/api/user/smslogin
*/

router.get('/smslogin', function(req, res, next) {
    // 验证码登录
    const tel = req.query.tel
    const code = req.query.code
    // 首先验证手机号是否存在
    sql.find(user,{tel},{_id:0,__v:0}).then(data=>{
        if(data.length <= 0){
            res.send({
                state:201,
                title:"手机号不正确"
            })
    
        }else{
            // 存在，继续下一步
            // 验证密码是否和用户名或手机号匹配
            if(code === data[0].code){

                const token = jwt.sign({
                    userId: data[0].userId,
                    isLogin:"ok"
                }, "qiuxiaolong", {
                    expiresIn: 24 * 60 * 60
                });

                console.log(data[0].userId)
                if(!data[0].userId){
                    sql.update(user, {tel},{
                        userId:"user"+uuid.v1(),
                        lastTime:Date.now(),
                        loginState:1
                    }).then(()=>{
                        sql.find(user,{tel},{_id:0,__v:0}).then(data => {
                            res.send({
                                state:200,
                                title:"登录成功",
                                id:data[0].userId,
                                token
                            })
                        })
                    })
                }else{
                    sql.update(user, {tel},{
                        lastTime:Date.now(),
                        loginState:1
                    })
                    res.send({
                        state:200,
                        title:"登录成功",
                        id:data[0].userId,
                        token
                    })
                }

                
            }else{
                // 不匹配，提示验证码不正确
                res.send({
                    state:202,
                    title:"验证码不正确"
                })
            }
        }
    })
})


/**
* @apiGroup 用户模块
* @api {get} /user/login 用户名或手机号登录
* @apiVersion 0.0.0
* @apiDescription 用户名或手机号登录
* @apiParam {string} loginName 用户输入的用户名
* @apiParam {string} password 用户输入的密码
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {json} data 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    state:201,
    title:"用户名或手机号未注册"
})
res.send({
    state:200,
    title:"登录成功",
    id: "userId",
    token
})
res.send({
    state:202,
    title:"用户名或手机号与密码不符"
})
* @apiSampleRequest http://localhost:3000/api/user/login
*/


//用户名或手机号登录
router.get('/login', function(req, res, next) {
    // 用户名或手机号登录
    const password = req.query.passWord;
    const loginName = req.query.userName;
    let tel ="";
    let userName = "";
    if(loginName.length === 11){
        tel = loginName
    } else {
        userName = loginName
    }
    // 首先验证用户名或手机号是否存在
    sql.find(user,{$or:[{userName},{tel}]},{_id:0,__v:0}).then(data=>{
        // 不存在，则提示用户用户名未注册
        if(data.length <= 0){
            res.send({
                state:201,
                title:"用户名或手机号未注册"
            })
        }else{
            // 存在，继续下一步
            // 验证密码是否和用户名或手机号匹配
            console.log(md5(password))
            console.log(data[0])
            if(md5(password) === data[0].password){

                const token = jwt.sign({
                    userId: data[0].userId,
                    isLogin:"ok"
                }, "qiuxiaolong", {
                    expiresIn: 24 * 60 * 60
                });

                // 匹配，提示登录成功
                res.send({
                    state:200,
                    title:"登录成功",
                    id:data[0].userId,
                    token
                })

                sql.update(user, {userId:data[0].userId},{
                    lastTime:Date.now(),
                    loginState:1
                })
            }else{
                // 不匹配，提示用户密码不符
                res.send({
                    state:202,
                    title:"用户名或手机号与密码不符"
                })
            }
        }
    })
})



/**
* @apiGroup 用户模块
* @api {get} /user/getUser 获取用户信息
* @apiVersion 0.0.0
* @apiDescription 获取用户信息
* @apiParam {string} userId 用户的唯一Id
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {json} data 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"请求用户信息成功",
    data:data[0]
})
res.send({
    state:300,
    title:"登录信息已失效"
})
* @apiSampleRequest http://localhost:3000/api/user/getUser
*/

router.get("/getUser",function(req,res,next){
    const { userId } = req.query;
    tools.verify(req).then(()=>{
        sql.find(user,{userId},{_id:0,__v:0}).then(data=>{
            res.send({
                state:200,
                title:"请求用户信息成功",
                data:data[0]
            })
        })
    }).catch(err=>{
        res.send({
            state:300,
            title:"登录信息已失效"
        })
    })
})


/**
* @apiGroup 用户模块
* @api {post} /user/setUser 修改用户信息
* @apiVersion 0.0.0
* @apiDescription 修改用户信息
* @apiParam {string} userId 用户的唯一Id
* @apiParam {string} userData 要修改的用户信息
* @apiSuccess {number} state 请求状态
* @apiSuccess {string} title 请求说明
* @apiSuccess {json} data 请求说明
* @apiSuccessExample {json} Success-Response:
res.send({
    state:200,
    title:"请求用户信息成功",
    data:data[0]
})
res.send({
    state:300,
    title:"登录信息已失效"
})
* @apiSampleRequest http://localhost:3000/api/user/setUser
*/

router.post("/setUser",function(req,res,next){
    const {userId,userData} = req.body;

    tools.verify(req).then(()=>{
        sql.update(user, {userId}, userData).then(()=>{
            sql.find(user,{userId}).then(data=>{
                res.send({
                    state:200,
                    title:"请求用户信息成功",
                    data:data[0]
                })
            })
        })
    }).catch(()=>{
        res.send({
            state:300,
            title:"验证失败，请重新登录"
        })
    })
})




module.exports = router;
